#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "string.h"

// 定义一个队列句柄
QueueHandle_t queue_handle = NULL;

// 定义一个队列数据结构,用来承载数据
typedef struct {
    int value;
} queue_data_t;

// 定义队列需要的任务A，用于接收并打印队列数据
void taskA(void *param){
    // 从队列里面接收数据，并打印
    queue_data_t data;
    while(1){
        /*
          xQueueReceive
          参数 1     队列句柄
          参数 2     接收到的数据的地址
          参数 3     等待时间，100 个tick
        */
        if (pdTRUE == xQueueReceive(queue_handle, &data, 100)  )
        {
            // 打印接收到的数据
            ESP_LOGI("queue", "receive queue value: %d", data.value);
        }
    }
}

// 定义队列需要的任务B，用于向队列发送数据
void taskB(void *param){
    // 定义一个队列数据结构
    queue_data_t data;
    // 初始化结构体
    memset(&data, 0, sizeof(queue_data_t));
    // 每隔一秒向队列发送数据
    while (1)
    {
       xQueueSend(queue_handle, &data, 100);
       // 定时任务
       vTaskDelay(pdMS_TO_TICKS(1000));
       // 更改数据
       data.value++;
    }
}
void app_main(void)
{
    /* 1. 创建队列
    参数解析
    1. 队列长度：10
    2. 队列元单元占用内存字节数
    */
   queue_handle = xQueueCreate(10,sizeof(queue_data_t));
   // 2. 创建任务A 接收队列数据
   xTaskCreatePinnedToCore(taskA, "taskA", 2048, NULL, 3, NULL, 1);
   // 3. 创建任务B 向队列发送数据
   xTaskCreatePinnedToCore(taskB, "taskB", 2048, NULL, 3, NULL, 1);
}
